From b090bb926721b8110c2e8f48a4c8f31e1dcc1867 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Fri, 17 Feb 2006 14:42:02 -0700 Subject: [PATCH] [IA64] declaration of metaphysical_rr I'm making a patch for domain destruction. While I tested my patch by repeatedly creating/destructing domains, a reserved register/field fault occurred in load_region_regs(). The cause of this fault is rr0 value overflow(0xFFFFFFFF********) because metaphysical_rr0 in the arch_domain struct is declared as integer (should be unsigned long). The attached patch fixes the problem. Signed-off-by: Masaki Kanno --- xen/arch/ia64/xen/hyperprivop.S | 6 +++--- xen/include/asm-ia64/domain.h | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/xen/arch/ia64/xen/hyperprivop.S b/xen/arch/ia64/xen/hyperprivop.S index 0f6c37b433..7aa1eadc78 100644 --- a/xen/arch/ia64/xen/hyperprivop.S +++ b/xen/arch/ia64/xen/hyperprivop.S @@ -1336,7 +1336,7 @@ ENTRY(hyper_ssm_dt) movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; ld8 r22=[r22];; adds r22=IA64_VCPU_META_SAVED_RR0_OFFSET,r22;; - ld4 r23=[r22];; + ld8 r23=[r22];; mov rr[r0]=r23;; srlz.i;; st4 [r20]=r0 ;; @@ -1372,7 +1372,7 @@ ENTRY(hyper_rsm_dt) movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; ld8 r22=[r22];; adds r22=IA64_VCPU_META_RR0_OFFSET,r22;; - ld4 r23=[r22];; + ld8 r23=[r22];; mov rr[r0]=r23;; srlz.i;; adds r21=1,r0 ;; @@ -1733,7 +1733,7 @@ ENTRY(hyper_set_rr) dep r23=r28,r23,16,8;; dep r23=r29,r23,8,8 cmp.eq p6,p0=r25,r0;; // if rr0, save for metaphysical -(p6) st4 [r24]=r23 +(p6) st8 [r24]=r23 mov rr[r8]=r23;; // done, mosey on back 1: mov r24=cr.ipsr diff --git a/xen/include/asm-ia64/domain.h b/xen/include/asm-ia64/domain.h index a812ac5576..36318027d1 100644 --- a/xen/include/asm-ia64/domain.h +++ b/xen/include/asm-ia64/domain.h @@ -15,8 +15,8 @@ extern void domain_relinquish_resources(struct domain *); struct arch_domain { struct mm_struct *active_mm; struct mm_struct *mm; - int metaphysical_rr0; - int metaphysical_rr4; + unsigned long metaphysical_rr0; + unsigned long metaphysical_rr4; int starting_rid; /* first RID assigned to domain */ int ending_rid; /* one beyond highest RID assigned to domain */ int rid_bits; /* number of virtual rid bits (default: 18) */ @@ -61,10 +61,10 @@ struct arch_vcpu { unsigned long xen_timer_interval; #endif mapped_regs_t *privregs; /* save the state of vcpu */ - int metaphysical_rr0; // from arch_domain (so is pinned) - int metaphysical_rr4; // from arch_domain (so is pinned) - int metaphysical_saved_rr0; // from arch_domain (so is pinned) - int metaphysical_saved_rr4; // from arch_domain (so is pinned) + unsigned long metaphysical_rr0; // from arch_domain (so is pinned) + unsigned long metaphysical_rr4; // from arch_domain (so is pinned) + unsigned long metaphysical_saved_rr0; // from arch_domain (so is pinned) + unsigned long metaphysical_saved_rr4; // from arch_domain (so is pinned) int breakimm; // from arch_domain (so is pinned) int starting_rid; /* first RID assigned to domain */ int ending_rid; /* one beyond highest RID assigned to domain */ -- 2.30.2